<?php
/*
1 Всавить вот эту вот <!--index--> штуку, до индексируемой части и после.
2 $shag_r - глубина погружения рекусивной функции, если сценарий завершится, не проиндексировав сайт до конца, то уменьшить шаг.
4 max_execution_time - максимальное время выполнения сценария, если скрипт не уложется в час, то можно увелисить.
5 memory_limit - чем больше значение, тем быстрее индексация
6 таблица:

CREATE TABLE `indexes` (
`id` int(100) NOT NULL auto_increment,
`url` varchar(255) NOT NULL default '',
`title` varchar(255) NOT NULL default '',
`btext` text NOT NULL,
PRIMARY KEY  (`id`)
);
*/
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) ? $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' : false)
{
	ini_set('max_execution_time', '7200');
	ini_set('memory_limit',       '512M');
	
	/* PEAR Class */
	require_once ('Net/URL2.php');
	require_once ('HTTP/Request2.php');
	
	require_once ("../core/header.php");
	require_once ("../core/cfg.php");
	require_once ("../core/strip_tags_smart.php");
	
	
	define("HTTP_PATH", "http://".$_SERVER['HTTP_HOST']);
	
	echo '<ol>';
	
	class AJAX_REINDEX_SITE 
	{
		private $shag_r = 30;
		private $indexed = array();
		
		public function __construct() 
		{						
			$this->table_index = PRFX."indexes";
			self::truncate_optimize_table();
			self::reindex();			
			self::truncate_optimize_table("OPTIMIZE");			
		}
		
		private function truncate_optimize_table($s = "TRUNCATE") {
			$r =& Registry::get("MDB")->query($s." TABLE `".$this->table_index."`;");
			if (PEAR::isError($r)) {
				die($r->getMessage().' ::: '.$r->getUserInfo());
			}
		}	
	
		private function insert_item($url, $title, $text) {
			if(!empty($title)) {
				$title = str_replace(' - '.NAME_SITE, '', $title);		
				$r =& Registry::get("MDB")->query("INSERT INTO `".$this->table_index."` VALUES ('', '".mysql_real_escape_string($url)."','".mysql_real_escape_string($title)."','".mysql_real_escape_string($text)."');");		
				if (PEAR::isError($r)) {
					die($r->getMessage().' ::: '.$r->getUserInfo());
				}
			}
		}
	
		private function reindex($uri = '/')
		{
			if(in_array($uri, $this->indexed)) {
				return false;
			}
			
			if(
				strpos($uri, 'http://') === 0 || 
				strpos($uri, 'https://') === 0 || 
				strpos($uri, 'javascript:') === 0 || 
				strpos($uri, 'mailto:') === 0 || 
				($uri == '#')				
			) {
				return false;
			}
			
				
			if((substr($uri, -5, 5) == ".html") || ($uri == "/")) 
			{					
				$uri = str_replace("//", "/", "/".$uri);
				$url = HTTP_PATH.$uri;
				$request = new HTTP_Request2($url, HTTP_Request2::METHOD_GET);
				try 
				{
					$response = $request->send();
					if(200 == $response->getStatus()) {
						$html = $response->getBody();
					}
					else {
						echo '<li><strong>Unexpected HTTP status:</strong> ' . $response->getStatus() . ' ' .$response->getReasonPhrase().'; <strong>URL:</strong> '.$url.'</li>';
					}
				} catch (HTTP_Request2_Exception $e) {
					echo '<li><strong>Error:</strong> '.$e->getMessage()."</li>";
				}				
				preg_match("|<title>(.*)</title>|U", $html, $title);
				$content = explode('<!--index-->', $html);
				$text = preg_replace('@<script[^>]*?>.*?</script>@si', '', $content[1]);
				$text = preg_replace('@<style[^>]*?>.*?</style>@si',   '', $text);
				$text = preg_replace('/(\s+)|(&[a-zA-Z0-9#]+;)/',      ' ', strip_tags_smart($text));	
			
				/* Вставка записи */
				self::insert_item($url, $title[1], $text);
				
				$countLink = sizeof($this->indexed);
				$countLink++;
				$this->indexed[$countLink] = $uri;
				preg_match_all("|href=\"[^\"]+\"|U", $html, $hrefs);
				/*echo "<pre>";
				print_r($hrefs);
				echo "</pre>";*/
				foreach($hrefs[0] as $link)
				{
					$link = str_replace(array('href=', '"',	HTTP_PATH), '', $link);					
					self::reindex($link);
				}
			}			
		}
	}
	if(!class_exists("HTTP_Request2")) {
		echo "<li>Error load class <strong>HTTP_Request2</strong>!</li>";
	}
	else {
		$ob_ajax = new AJAX_REINDEX_SITE;
		echo '<li>Сайт <span style="color:#ff590c"><b>"'.HTTP_PATH.'"</b></span> успешно проиндексирован!</li>';
	}	
	echo '</ol>';
	exit();
}






class ControllerAdmin_Search extends ControllerAdmin_Base
{
	public function __construct($section) {		
		$this->section      = $section;
		$this->common_vars  = Registry::get("common_vars");
		$this->table_module = PRFX."search";
	}	
	
	public function init(){}
    public function out()
	{					   
		$r =& Registry::get("MDB")->query("SELECT * FROM `".$this->table_module."` ORDER BY `Count` DESC;");
		if (PEAR::isError($r)) {
			die($r->getMessage().' ::: '.$r->getUserInfo());
		}
		if($r->numRows()) {
			while($Field = $r->fetchRow(MDB2_FETCHMODE_ASSOC)) {
				$ArrItems[] = $Field;
			}
		}		
		Registry::get("smarty")->assign(array(
			'ArrItems' => $ArrItems
		));		
		return Registry::get("smarty")->fetch(TEMPLATE_ADMIN.$this->common_vars["controller_template"], Registry::get("cache_id"));				
    }
}

$controller = new ControllerAdmin_Search($section);
$ob_admin_out = $controller->out();

?>